package Utilities;

/*
 * Contenedor.java
 * Realizado por: Paulo Chang        11076
 *                Oscar Castañeda    11086
 *                Francisco Martínez 11096
 * Creado el 20 de agosto del 2011
 * Modificado por última vez el 16 de septiembre del 2011.
 * Esta clase representa a un contenedor en el cual se pueden almacenar una o
 * más cargas para ser transportadas de un puerto a otro por medio de barcos.
 */

import java.io.Serializable;
import java.util.ArrayList;

/**
 * @author francisco
 */

public class Contenedor implements Serializable{
    
    /*--------------------------------------------------------------------------     
     * Atributos
     */
    private static float capacidad; //Capacidad, en toneladas métricas, que puede almacenar un contenedor.
    private float espacioLibre; //Espacio restante, en toneladas métricas, de un contenedor.
    private float peso=0; //Toneladas métricas del contenedor ocupadas por una carga.
    private ArrayList<Carga> misCargas; //Lista con todas las cargas que tiene un contenedor.
    private Puerto puertoOrigen, puertoDestino; //Puerto del cual parte y al cual se dirige el contenedor.
    private String nombre; //Nombre del contenedor

    /*--------------------------------------------------------------------------
     *Métodos 
     */
    
    /**
     * Constructor
     * Crea un nuevo contenedor y lo agrega a la lista.
     * No tiene interfaz, porque se crean automáticamente al crear cargas.
      * @param destino id del barco de destino.
      * @param peso peso de la carga "inicial" en toneladas.
      */
    public Contenedor(String nombre1,Puerto origen,Puerto destino,Carga carga, float elPeso){
        nombre=nombre1;
        puertoOrigen=origen;
        puertoDestino=destino;
        espacioLibre=capacidad-elPeso;
        peso=elPeso;
        misCargas=new ArrayList<Carga>();
        misCargas.add(carga);

    }
  
    /**
     * Getter, es la misma capacidad para todos los contenedores.
     * @return capacidad
     */
    public static float getCapacidad() {
        return capacidad;
    }
    
    /**
     * Setter. Es la misma capacidad para todos los contenedores, se pone al
     * inicio del programa.
     * @param capacidad
     */
    public static void setCapacidad(float capacidad) {
        Contenedor.capacidad = capacidad;
        }
    
    /**
     * Puerto destino.
     * @return id del puerto al que se dirige el contenedor y sus cargas
     */
    public Puerto getPuertoDestino() {
        return puertoDestino;
    }
    
    /**
     * Espacio Libre
     * @return espacioLibre que queda en el contenedor, en toneladas.
     */
    public float getEspacioLibre() {
        return espacioLibre;
    }

    /**
     * getMisCargas
     * Devuelve el atributo misCargas del contenedor.
     * @return misCargas ArrayList que contiene a todas las cargas que se
     * encuentran en un contenedor.
     */
    public ArrayList<Carga> getMisCargas() {
        return misCargas;
    }

    /**
     * getNombre
     * Devuelve el atributo nombre del contenedor.
     * @return nombre String con el nombre del contenedor.
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * agregarCarga
     * Permite agregar una nueva carga al contenedor.
     * @param carga Instancia de la clase Carga a agregar en el contenedor.
     * @param elPeso Float que indica cuantas toneladas métricas ocupa la carga.
     */
    public void agregarCarga(Carga carga,float elPeso){
        espacioLibre-=elPeso;
        peso+=elPeso;
        misCargas.add(carga);
    }

    /**
     * toString
     * Devuelve información de contenedor.
     * @return mensaje String que contiene el nombre, peso, puertos de origne y
     * de destino, así como las cargas del contenedor.
     */
    @Override
    public String toString(){
        String mensaje="\n\" "+nombre+" \"";
        mensaje+="\nPeso: "+peso+" toneladas";
        mensaje+="\nPuerto Origen: "+puertoOrigen.getNombre();
        mensaje+=", "+puertoOrigen.getPais();
        mensaje+="\nPuerto Destino: "+puertoDestino.getNombre();
        mensaje+=", "+puertoDestino.getPais()+"\nCargas: ";
        if(misCargas.size()>0){
            for(int i=0;i<misCargas.size();i++){
                Carga carga=misCargas.get(i);
                mensaje+=carga.getNombre()+"; ";
            }
        }
        return mensaje;
    }

    /**
     * getPeso
     * Devuelve el atributo peso del contenedor.
     * @return peso Float que indica cuantas toneladas métricas del contenedor
     * han sido ocupadas ya por una carga.
     */
    public float getPeso() {
        return peso;
    }
    
}
